home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asm_msc1.arc / EX42.ASM < prev    next >
Assembly Source File  |  1988-11-20  |  3KB  |  95 lines

  1. TITLE  32-Bit x 32-Bit Signed Multiply  (EX42.ASM)
  2.           PAGE      ,132
  3. OUR_DATA  SEGMENT   PARA 'DATA'
  4. HI_MCND   DW    ?
  5. LO_MCND   DW    ?
  6. HI_PP1    DW    ?
  7. LO_PP1    DW    ?
  8. HI_PP2    DW    ?
  9. LO_PP2    DW    ?
  10. HI_PP3    DW    ?
  11. LO_PP3    DW    ?
  12. HI_PP4    DW    ?
  13. LO_PP4    DW    ?
  14. NEG_IND   DB    ?
  15. OUR_DATA  ENDS
  16. OUR_CODE  SEGMENT   PARA 'CODE'
  17.       PUBLIC    MULS32
  18. MULS32    PROC      FAR
  19.           ASSUME    CS:OUR_CODE,DS:OUR_DATA
  20. ;
  21. ;  Initialize the data segment address.
  22. ;
  23.       PUSH        DS             ;Save caller's DS and DI
  24.       PUSH        DI
  25.           MOV       DI,OUR_DATA      ;Initialize DS
  26.           MOV       DS,DI            
  27. ;
  28. ;  The main procedure follows.
  29. ;
  30.       MOV        NEG_IND,0        ;Negative indicator = 0
  31.       CMP       DX,0         ;Multiplicand negative?
  32.       JNS        CHKCX         ; No.  Go check multiplier
  33.       NOT        AX                ; Yes.  2s-comp. multiplicand
  34.       NOT        DX             
  35.       ADD        AX,1
  36.       ADC        DX,0
  37.       NOT        NEG_IND         ;  and 1s-comp. indicator
  38. CHKCX:      CMP       CX,0            ;Multiplier negative?
  39.       JNS        GOMUL         ; No.  Go multiply
  40.       NOT        BX             ; Yes.  2s-comp. multiplier
  41.       NOT        CX             
  42.       ADD        BX,1
  43.       ADC        CX,0
  44.       NOT        NEG_IND         ;  and 1s-comp. indicator
  45. ;
  46. ;  This is the MULU32 code.
  47. ;
  48. GOMUL:    MOV       HI_MCND,DX       ;Save multiplicand in memory
  49.       MOV       LO_MCND,AX       
  50.       MUL        BX             ;Form partial product #1
  51.       MOV       HI_PP1,DX        ; and save it in memory
  52.       MOV       LO_PP1,AX
  53.       MOV        AX,HI_MCND       ;Form partial product #2
  54.       MUL        BX
  55.       MOV        HI_PP2,DX         ; and save it in memory
  56.       MOV        LO_PP2,AX
  57.       MOV        AX,LO_MCND         ;Form partial product #3
  58.       MUL        CX
  59.       MOV       HI_PP3,DX         ; and save it in memory
  60.       MOV        LO_PP3,AX
  61.       MOV        AX,HI_MCND         ;Form partial product #4
  62.       MUL        CX
  63.       MOV       HI_PP4,DX         ; and save it in memory
  64.       MOV        LO_PP4,AX
  65.       MOV        AX,LO_PP1         ;Low 16 bits
  66.       MOV        BX,HI_PP1         ;Form mid-lower 16 bits
  67.       ADD        BX,LO_PP2         ; with sum #1
  68.           ADC       HI_PP2,0
  69.           ADD       BX,LO_PP3         ; and sum #2
  70.       MOV        CX,HI_PP2         ;Form mid-upper 16 bits
  71.       ADC        CX,HI_PP3         ; with sum #3
  72.           ADC       HI_PP4,0
  73.           ADD       CX,LO_PP4        ; and sum #4
  74.       MOV        DX,HI_PP4         ;Form high 16 bits
  75.       ADC        DX,0         ; including propagated carry
  76. ;
  77. ;  End of MULU32 code.
  78. ;
  79.       CMP        NEG_IND,0         ;Does product have right sign?
  80.       JZ        DONE         ; Yes.  Exit.
  81.       NOT        AX             ; No.  2s-comp. product
  82.       NOT        BX
  83.       NOT        CX
  84.       NOT        DX
  85.       ADD        AX,1
  86.       ADC        BX,0
  87.       ADC        CX,0
  88.       ADC        DX,0
  89. DONE:     POP        DI             ;Restore caller's registers
  90.       POP        DS
  91.       RET
  92. MULS32    ENDP
  93. OUR_CODE  ENDS
  94.          END       MULS32
  95.